import re

from django import http
from django.http import HttpResponse, JsonResponse
from django.shortcuts import render, redirect
from django.urls import reverse
from django.views import View
from django.contrib.auth import login
from apps.users.models import User
from django.contrib.auth.backends import ModelBackend

"""
一、我们把需求写下来（前端需要收集数据，后端要干什么）
    前端：用户名，密码，确认密码，手机号
    后端：实现注册
二、把后端的思路写下来（把一些能够想到的内容都写下来）
    1.接收数据
    2.验证数据
        2.1判断必须入库的数据是否都提交过来
        2.2判断用户名是否符合逻辑，判断是否重复
        2.3判断密码是否符合逻辑
        2.4判断密码和确认密码是否一致
        2.5判断手机号是否符合要求，判断手机号是否重复
    3.数据入库
    4.返回响应
三、确定请求方式和路由
    POST register/
"""


class RegisterView(View):
    def get(self, request):
        return render(request, 'register.html')
        # return HttpResponse('注册自应用')

    def post(self, request):
        #   1.接收数据
        username = request.POST.get('username')
        password = request.POST.get('password')
        password2 = request.POST.get('password2')
        mobile = request.POST.get('mobile')
        #   2.验证数据
        #       2.1判断必须入库的数据是否都提交过来
        if not all([username, password, password2, mobile]):
            return http.HttpResponseBadRequest("参数不全")
        #       2.2判断用户名是否符合逻辑
        if not re.match(r'[a-zA-Z0-9_-]{5,20}', username):
            return http.HttpResponseBadRequest('参数不正确')
        #       2.3判断密码是否符合逻辑
        if not re.match(r'[0-9A-Za-z]{8,20}', password):
            return http.HttpResponseBadRequest('参数不正确')
        #       2.4判断密码和确认密码是否一致
        if password != password2:
            return http.HttpResponseBadRequest('两次输入的密码不一致')
        #       2.5判断手机号是否符合要求
        if not re.match(r'1[345789]\d{9}', mobile):
            return http.HttpResponseBadRequest('手机号不正确')

        # 3.数据入库
        user = User.objects.create_user(username=username, password=password, mobile=mobile)
        # 可以自己设置
        # request.session['user_id']=user.id
        # 借助于系统的session来设置session信息（session保存在服务器中）
        from django.contrib.auth import login
        login(request, user)

        # 4.返回响应
        path = reverse('contents:index')
        response = redirect(path)
        return response
        # return HttpResponse("注册成功")


"""
一、把需求写下来（前端要收集什么数据，后端要做什么）
    前端：收集用户名信息
    后端：判断用户名是否重复
二、把后端的思路写下来（把一些能够想到的内容都写下来）
    1.获取用户名
    2.查询用户名
    我们根据查询的用户名的数量来判断用户名是否重复   不重复count=0  重复count=1
    User.objects.filter(username=username).count()
    3.返回响应（页面没有刷新，所以返回json）
三、确定请求方式和路由（请求路径）
GET    username（？P<username>[a-zA-Z0-9_-]{5,20}）/count                        关键字
GET    usernamecount//?username=xxxxxx                                          request.GET
POST    usernamecount/                                                body      request.POST
"""


# 验证用户名是否重复
class UsernameCountView(View):
    def get(self, request, username):
        # 1.获取用户名
        # 2.查询用户名
        #       我们根据查询的用户名的数量来判断用户名是否重复
        #       不重复count = 0    重复count = 1
        #       User.objects.filter(username=username).count()
        # 3.返回响应（页面没有刷新，所以返回json）
        count = User.objects.filter(username=username).count()
        return http.JsonResponse({'count': count})


# # 验证手机号是否重复
# class MobileCount(View):
#     def get(self, request, mobile):
#         mobile_count = User.objects.filter(mobile=mobile).count()
#         return http.JsonResponse({'count': mobile_count})


# 一、前端要做什么，后端要做什么
#     前端：收集用户名和密码
#     后端：就是登陆
# 二、后端的思路写下来（想到什么就写什么）
#     接收数据
#     验证数据
#     登陆（验证用户名和密码是否正确）
#     设置登陆状态（session）
#     返回响应
# 三、确定请求方式和路由

# 注册成功后自动登陆
class LoginView(View):
    def get(self, request):
        return render(request, 'login.html')

    def post(self, request):
        #     接收数据
        username = request.POST.get('username')
        password = request.POST.get('password')
        remembered = request.POST.get('remembered')
        next=request.GET.get('next')

        #     验证数据
        #         判断参数是否齐全
        if not all([username, password]):
            return http.HttpResponseBadRequest('参数不齐全,登陆出现的bug')
        # 判断用户名和密码是否符合规则
        if not re.match(r'[a-zA-Z0-9_-]{5,20}', username):
            return http.HttpResponseBadRequest('用户名不符合规则')
        if not re.match(r'[0-9A-Za-z]{8,20}', password):
            return http.HttpResponseBadRequest('密码不符合规则')
        #     登陆（验证用户名和密码是否正确）
        #         登陆查询有两种方式：
        # ① 根据用户名进行查询
        # ② 使用系统为我们提供的查询判断
        from django.contrib.auth import authenticate
        # 如果认证成功(用户名和密码都正确)返回user对象
        # 如果认证不成功(用户名/密码 不正确)返回None
        user = authenticate(username=username, password=password)
        if user is None:
            return http.HttpResponseBadRequest('用户名或密码不正确')

        # 设置记住登陆
        # 如果被点击了,我们让session保存14天
        # 如果没有被点击,我们让session保存到浏览器会话结束(浏览器关闭)
        login(request, user)
        if remembered == 'on':
            request.session.set_expiry(None)
        else:
            request.session.set_expiry(0)

        #     设置登陆状态（session）
        #         from django.contrib.auth import login
        #         login(request,user)

        # 判断用户是否登陆,  布尔值
        # request.user.is_authenticated

        #     返回响应
        # 判断next是否有值
        if next :
            # 有值的话重定向到指定路由
            response=redirect(next)
        else:
            # 没有值的话重定向到首页
            response = redirect(reverse('contents:index'))

        response.set_cookie('username', user.username)
        return response


#         return http.response("登陆成功")

"""
一.把需求写下来(前端要收集什么,后端要做什么)
    
    后端:退出----清除用户登陆的session信息
二.把后端的思路梳理一下
    
    logout
三.确定请求方式和路由
    GET   logout/
"""
from django.contrib.auth import logout


class LogoutView(View):
    def get(self, request):
        logout(request)
        response = redirect(reverse('contents:index'))
        # response.set_cookie('username','',max_age=0)
        response.delete_cookie('username')
        return response


# 用户个人信息展示
from django.contrib.auth.mixins import LoginRequiredMixin


class UserInfoView(LoginRequiredMixin, View):
    login_url = '/login/'

    def get(self, request):
        return render(request, 'user_center_info.html')
